import {IRetbody} from '../entity/retBody'

export default () => {
  return async function responseHandler(ctx, next) {
    try {
      await next();
    } catch (err) {
      console.log(err);
      // 业务逻辑错误
      if (err.bizError) {
        if (err.log) ctx.app.emit('error', err, ctx);
        const status = err.bizParams.status || 200;
        ctx.status = status;
        ctx.body = {
          code: err.code,
          data: null,
          msg: err.bizParams.message,
        } as IRetbody;
      } else {
        // 服务器内部错误所有的异常都在 app 上触发一个 error 事件，框架会记录一条错误日志
        ctx.app.emit('error', err, ctx);
        const status = err.status || 500;
        const code = err.code || status
        // 生产环境时 500 错误的详细错误内容不返回给客户端，因为可能包含敏感信息
        const error = status === 500 && ctx.app.config.env === 'prod'
          ? 'Internal Server Error'
          : err.message;
        // 从 error 对象上读出各个属性，设置到响应中
        ctx.status = status;
        ctx.body = {
          code,
          data: null,
          msg: error,
        } as IRetbody;
      }
    }
  };
};